package zju.dgm.service.distsqlservice;

import zju.dgm.dto.DataFrame;

import java.io.IOException;

public interface DistSqlUtilProvider {

    int ERR = -1;       // 错误类型
    int RET = 0;        // 返回类型
    int CREATE = 1;     // 增：涉及新建表的写请求
    int DELETE = 2;     // 删：涉及删除表的写请求
    int UPDATE = 3;     // 改：修改表的写请求，不涉及增删
    int SELECT = 4;     // 查：不涉及修改的查询操作

    /**
     * 集成接口
     * @param table 表名
     * @param type 查询类型
     * @param sql 可执行的sql语句字符串
     * @return 返回String查询结果，或发生错误时返回null
     */
    String distSql(String table, int type, String sql);

//    /**
//     * 收到客户端读请求后调用的部分
//     * @param request  DataFrame格式的请求数据体
//     * @return 返回封装的查询结果
//     * @throws Exception 可能的网络错误之类，出现时应当做查询失败处理
//     */
//    DataFrame readCall(DataFrame request) throws Exception;
//
//    /**
//     * 封装写请求信息后调用，需要附带写类型，分为 增/删/改
//     * @param request 封装后的写请求数据体
//     * @return 返回封装的执行结果
//     * @throws Exception 执行过程中发生的错误，当作执行失败处理
//     */
//    DataFrame writeCall(DataFrame request) throws Exception;
//
//    /**
//     * 将查询信息封装为DataFrame以便与Server之间传输
//     * @param ip  源Server或Client的ip信息
//     * @param table  查询的表名，用于检测表与Server的从属关系
//     * @param type 该次查询的类型，CREATE/DELETE/UPDATE/SELECT
//     * @param sql   以字符串表示的sql语句
//     * @return  封装后的DataFrame
//     */
//    DataFrame sealMessage(String ip, String table, int type, String sql);
//
//
//    /**
//     * 调用该函数将查询结果封装的DataFrame解封为查询结果字符串, 返回值为null时发生错误
//     * @param df 需要解封的查询结果
//     * @return String类型的查询结果，增删改为执行结果，查为JSON字符串，需要客户端解析
//     */
//    String unsealMessage(DataFrame df);
//
////    分布式锁抢占回复

    /**
     * 得到本Server某个表的日志文件
     * @param table 传入表名
     * @return 返回封装的日志文件，dataFrame中的byte数组即为Arraylist的序列化结果
     * @throws IOException 可能的IO错误，发生错误则无法正常获取
     */
    DataFrame getLog(String table) throws IOException;

    /**
     * 传入表名和其封装的日志文件，返回重构结果
     * @param log   该表的日志
     * @return  miniSql的执行结果，DataFrame中byte数组为String类型结果的序列化，执行失败时返回null
     */
    DataFrame reDoWithLog(DataFrame log);
}
